Модуль 4 - Школа анализа инженерных данных
Диагностика акустических данных — домашнее задание
Цель: научиться применять обученную модель акустической диагностики: загружать модель из файла, извлекать параметры, выполнять нормализацию признаков, диагностировать отдельные сегменты и полные сигналы, а также работать с новыми акустическими данными.
Данные:
Bearing.mat— эталонные данные с акустическими сигналами подшипника;вычислить_признаки.jl— функция расчёта 54 диагностических признаков;разделить_на_сегменты.jl— функция разбиения сигнала на сегменты;модель_подшипника.jls— сохранённая модель с тремя случайными лесами и параметрами нормализации;Подшипник.wav— аудиофайл с акустическим сигналом для диагностики.
Формат сдачи: В проверочную систему Etude нужно вставить числа из вывода проверочных кодовых ячеек ✍️.
Важно: все задания выполняются последовательно в одном скрипте. Каждое последующее задание использует переменные и функции, созданные в предыдущих заданиях. Перед выполнением заданий обязательно запустите подготовительную ячейку, которая загружает все библиотеки и данные.
# ⚙️ ПОДГОТОВИТЕЛЬНЫЙ КОД
#Pkg.add(["MAT", "Statistics", "DSP", "FFTW", "DecisionTree", "StatsBase", "Random", "Serialization", "WAV"])
using MAT, Statistics, DSP, FFTW, DecisionTree, StatsBase, Random, Serialization, WAV
cd( @__DIR__ )
include("data/вычислить_признаки.jl");
include("data/разделить_на_сегменты.jl");
подшипник = matread("data/Bearing.mat");
норма = vec(подшипник["normal"]);
ролик = vec(подшипник["roller"]);
внутр = vec(подшипник["inner"]);
внеш = vec(подшипник["outer"]);
# Скачаем модель, которую обучили на прошлом шаге
using Downloads
src = "https://storage.yandexcloud.net/videohosting555/engee-ltc-school/%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BF%D0%BE%D0%B4%D1%88%D0%B8%D0%BF%D0%BD%D0%B8%D0%BA%D0%B0.jls"
dst = joinpath("$(@__DIR__)/data", "модель_подшипника.jls")
Downloads.download(src, dst)
# Выполните эту ячейку перед началом работы
✏️ Задание 1
Загрузите модель из файла data/модель_подшипника.jls с помощью функции deserialize и сохраните результат в переменную данные.
Подсказка: файл находится в папке data, поэтому путь к нему: "data/модель_подшипника.jls".
Внимание: время выполнения данной кодовой ячейки может составить несколько минут.
данные = # здесь напишите ваш код
for k in keys(данные)
println(k)
end
Выполните данную ячейку для вывода проверочного числа:
print(Int64(round(данные.эталонный_rms*1000))^2)
✏️ Задание 2
Извлеките из загруженной модели все необходимые параметры в отдельные переменные: три модели случайного леса, векторы средних и СКО, длину сегмента, перекрытие и частоту дискретизации.
Подсказка:
-
Модели извлекаются через точку:
данные.модель_внутр,данные.модель_внеш,данные.модель_ролик. -
Векторы нормализации:
данные.средние_признаковиданные.ско_признаков. -
Параметры сегментации:
данные.длина_сегмента,данные.перекрытие,данные.частота_дискретизации.
модель_внутр = # здесь напишите ваш код
модель_внеш = # здесь напишите ваш код
модель_ролик = # здесь напишите ваш код
средние = # здесь напишите ваш код
ско = # здесь напишите ваш код
длина_сегмента = # здесь напишите ваш код
перекрытие = # здесь напишите ваш код
частота_дискретизации = # здесь напишите ваш код
Выполните данную ячейку для вывода проверочного числа:
print(Int64(
модель_внутр.n_trees +
модель_внеш.n_trees +
модель_ролик.n_trees +
length(средние) +
length(ско) +
длина_сегмента +
Int(перекрытие * 100) +
частота_дискретизации))
✏️ Задание 3
Напишите функцию нормализовать, которая принимает вектор признаков и приводит его к тому же масштабу, на котором обучалась модель. Функция должна вычитать вектор средних и делить на вектор СКО.
Подсказка:
-
Функция принимает один аргумент
пр— вектор из 54 признаков. -
Переменные
средниеискоуже загружены в предыдущем задании. -
Используйте поэлементные операции:
(пр .- средние) ./ ско.
function # здесь напишите ваш код
return # здесь напишите ваш код
end
Выполните данную ячейку для вывода проверочного числа для Etude:
print(Int64(round(mean(нормализовать(collect(1.0:54.0))))))
✏️ Задание 4
Напишите функцию диагностика_сегмента, которая принимает один сегмент сигнала и частоту дискретизации, вычисляет признаки, нормализует их и предсказывает износ трёх элементов подшипника с помощью трёх моделей случайного леса. Функция должна возвращать словарь с тремя ключами.
Подсказка:
-
Вычислите признаки:
пр = нормализовать(вычислить_признаки(сигнал, fs)). -
Преобразуйте вектор в матрицу:
м = reshape(пр, 1, :). -
Предсказания выполняются через
DecisionTree.predict(модель_внутр, м)[1]. -
Для каждого элемента используйте
clamp(значение, 0, 100), чтобы ограничить диапазон. -
Верните словарь с ключами
"Износ внутреннего кольца","Износ внешнего кольца","Износ ролика".
function # здесь напишите ваш код
пр = # здесь напишите ваш код
м = # здесь напишите ваш код
износ_внутр = # здесь напишите ваш код
износ_внеш = # здесь напишите ваш код
износ_ролик = # здесь напишите ваш код
return Dict(
"Износ внутреннего кольца" => # здесь напишите ваш код
"Износ внешнего кольца" => # здесь напишите ваш код
"Износ ролика" => # здесь напишите ваш код
)
end
Выполните данную ячейку для вывода проверочного числа:
результат = диагностика_сегмента(норма[1:4000], 10000)
print(Int64(10e5*round(результат["Износ внутреннего кольца"] +
результат["Износ внешнего кольца"] +
результат["Износ ролика"], digits=5)))
✏️ Задание 5
Напишите функцию диагностика, которая принимает полный сигнал и частоту дискретизации, разделяет его на сегменты, диагностирует каждый сегмент и усредняет результаты. Функция должна возвращать словарь с округлёнными до одного знака после запятой значениями.
Подсказка:
-
Разделите сигнал:
сегменты = разделить_на_сегменты(полный_сигнал, длина_сегмента, перекрытие). -
Диагностируйте каждый сегмент через генератор списка:
[диагностика_сегмента(сег, fs) for сег in сегменты]. -
Усредните по каждому элементу с помощью
mean([р["ключ"] for р in результаты]). -
Верните словарь с
round(clamp(среднее, 0, 100), digits=1).
function # здесь напишите ваш код
сегменты = # здесь напишите ваш код
результаты = # здесь напишите ваш код
ср_внутр = # здесь напишите ваш код
ср_внеш = # здесь напишите ваш код
ср_ролик = # здесь напишите ваш код
return Dict(
"Износ внутреннего кольца" => # здесь напишите ваш код
"Износ внешнего кольца" => # здесь напишите ваш код
"Износ ролика" => # здесь напишите ваш код
)
end
Выполните данную ячейку для вывода проверочного числа:
результат = диагностика(внеш, 10000)
print(Int64((10*round(результат["Износ внутреннего кольца"] +
результат["Износ внешнего кольца"] +
результат["Износ ролика"], digits=1))))
✏️ Задание 6
Выполните диагностику полностью исправного подшипника. Используйте эталонный сигнал норма и частоту дискретизации. Сохраните результат в переменную ans6.
Подсказка:
-
Вызовите
диагностика(норма, частота_дискретизации). -
Для исправного подшипника все три значения должны быть близки к нулю.
ans6 = # здесь напишите ваш код
Выполните данную ячейку для вывода проверочного числа:
print(Int64((10*round(ans6["Износ внутреннего кольца"] +
ans6["Износ внешнего кольца"] +
ans6["Износ ролика"], digits=1))^3))
✏️ Задание 7
Выполните диагностику комбинированного сигнала с несколькими дефектами. Создайте смесь из нормального сигнала с добавлением дефектных составляющих внутреннего кольца, внешнего кольца и тела качения. Используйте формулу смешивания: внутреннее кольцо изношено на 8 процентов, внешнее кольцо на 7 процентов, тело качения (ролик) на 12 процентов. Сохраните результат в переменную ans7.
Подсказка:
-
Общая формула смешивания выглядит так:
норма + степень_внутр*(внутр-норма) + степень_внеш*(внеш-норма) + степень_ролик*(ролик-норма). -
Здесь каждый коэффициент
степень— это доля дефекта от 0 до 1, где 0 означает отсутствие дефекта, а 1 — полный дефект. -
Передайте смесь в
диагностикавместе счастота_дискретизации.
ans7 = # здесь напишите ваш код
Выполните данную ячейку для вывода проверочного числа:
print(Int64((10*round(ans7["Износ внутреннего кольца"] +
ans7["Износ внешнего кольца"] +
ans7["Износ ролика"], digits=1))^1))
✏️ Задание 8
Выполните диагностику аудиофайла Подшипник.wav. Загрузите файл с помощью функции wavread, затем передайте полученный сигнал в функцию диагностика. Сохраните результат в переменную ans8.
Подсказка:
-
Для чтения аудиофайла используйте функцию
wavread, которая возвращает сигнал и частоту дискретизации. Укажите путь"data/Подшипник.wav". -
Полученный сигнал передайте в функцию
диагностика. -
Результат сохраните в переменную
ans8.
подшипник, fs = # здесь напишите ваш код
ans8 = # здесь напишите ваш код
Выполните данную ячейку для вывода проверочного числа:
print(Int64((10*round(ans8["Износ внутреннего кольца"] +
ans8["Износ внешнего кольца"] +
ans8["Износ ролика"], digits=1))^2))
Заключение
Поздравляем! Вы успешно применили обученную модель для диагностики акустических данных. Вы научились загружать модель из файла, извлекать параметры, нормализовать признаки, диагностировать отдельные сегменты и полные сигналы, а также работать с аудиофайлами. Эти навыки позволят создавать готовые системы промышленного мониторинга, которые определяют состояние оборудования по акустическим сигналам.